package com.ruoyi.vote.admin.notice;

import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.vote.admin.domain.vo.VoteActivityVo;
import com.ruoyi.vote.admin.domain.vo.VotePrizeReceiveVo;
import com.ruoyi.vote.admin.domain.vo.WxSubTampVo;
import com.ruoyi.vote.admin.service.IVoteSignService;
import com.ruoyi.vote.admin.service.IWxSubTampService;
import com.ruoyi.vote.common.constants.SubModelConstants;
import com.ruoyi.vote.common.messge.WeChatMessageHandler;
import com.ruoyi.weixin.domain.WxUser;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 活动订阅通知任务
 * @author 立勤
 * @date 2023/07/25 15:44:23
 */
@RequiredArgsConstructor
@Service
@Slf4j
public class VoteNoticeJob {

    private final IVoteSignService signService;
    private final IWxSubTampService subTampService;


//        订阅消息参数值内容限制说明
//              ---摘自微信小程序官方：https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
//        参数类别 	参数说明 	参数值限制 	   说明
//        thing.DATA 	事物 	20个以内字符 	可汉字、数字、字母或符号组合
//        number.DATA 	数字 	32位以内数字 	只能数字，可带小数
//        letter.DATA 	字母 	32位以内字母 	只能字母
//        symbol.DATA 	符号 	5位以内符号 	只能符号
//        character_string.DATA 	字符串 	32位以内数字、字母或符号 	可数字、字母或符号组合
//        time.DATA 	时间 	24小时制时间格式（支持+年月日） 	例如：15:01，或：2019年10月1日 15:01
//        date.DATA 	日期 	年月日格式（支持+24小时制时间） 	例如：2019年10月1日，或：2019年10月1日 15:01
//        amount.DATA 	金额 	1个币种符号+10位以内纯数字，可带小数，结尾可带“元” 	可带小数
//        phone_number.DATA 	电话 	17位以内，数字、符号 	电话号码，例：+86-0766-66888866
//        car_number.DATA 	车牌 	8位以内，第一位与最后一位可为汉字，其余为字母或数字 	车牌号码：粤A8Z888挂
//        name.DATA 	姓名 	10个以内纯汉字或20个以内纯字母或符号 	中文名10个汉字内；纯英文名20个字母内；中文和字母混合按中文名算，10个字内
//        phrase.DATA 	汉字 	5个以内汉字 	5个以内纯汉字，例如：配送中

    /**
     *  活动开始通知
     * @return
     */
    public void voteStartNotice(VoteActivityVo voteActivity){
        // 查询活动开始的活动
        log.info("--- 活动开始订阅通知 - 活动ID: {} ,通知时间: {} ",voteActivity.getId(),DateUtils.dateTime());

        // 获取模板
        WxSubTampVo wxSubTampVo = subTampService.queryByModel(SubModelConstants.VOTE_START);
        if (ObjectUtil.isNotNull(voteActivity)) {
            List<WxUser> list = signService.queryWxUser(voteActivity.getId());
            log.info("--- 活动开始订阅通知人数: {} ,通知时间: {} ",list.size(),DateUtils.dateTime());
            if (CollUtil.isNotEmpty(list)){
                ArrayList<WxMaSubscribeMessage.MsgData> wxMaSubMsgList = new ArrayList<>();
                WxMaSubscribeMessage.MsgData msgData = new WxMaSubscribeMessage.MsgData();
                msgData.setName("thing2");
                msgData.setValue(voteActivity.getNotes().length() > 19 ? voteActivity.getNotes().substring(0,19):voteActivity.getNotes());
                wxMaSubMsgList.add(msgData);

                WxMaSubscribeMessage.MsgData msgData1 = new WxMaSubscribeMessage.MsgData();
                msgData1.setName("thing4");
                msgData1.setValue(voteActivity.getTitle());
                wxMaSubMsgList.add(msgData1);

                WxMaSubscribeMessage.MsgData msgData2 = new WxMaSubscribeMessage.MsgData();
                msgData2.setName("date3");
                msgData2.setValue(DateUtils.format(voteActivity.getVoteStartTime(),DateUtils.YYYYnMMnDDnHH_MM_SS));
                wxMaSubMsgList.add(msgData2);

                WxMaSubscribeMessage.MsgData msgData3 = new WxMaSubscribeMessage.MsgData();
                msgData3.setName("time16");
                msgData3.setValue(DateUtils.format(voteActivity.getBalanceTime(),DateUtils.YYYYnMMnDDnHH_MM_SS));
                wxMaSubMsgList.add(msgData3);

                WxMaSubscribeMessage.MsgData msgData4 = new WxMaSubscribeMessage.MsgData();
                msgData4.setName("thing12");
                msgData4.setValue("报名参赛");
                wxMaSubMsgList.add(msgData4);

                WeChatMessageHandler.sendWechatAppSubMessage(list,wxSubTampVo.getTampId(), wxSubTampVo.getPath(), wxMaSubMsgList);
                log.info("--- 活动开始通知成功- 通知时间: {} , 通知内容: {} ",list.size(), JSON.toJSONString(wxMaSubMsgList));
            }
            log.info("--- 活动开始通知失败- 没有需要通知的用户, 结束通知时间: {}",DateUtils.getTime());
        }
    }

    /**
     *  活动结束通知
     * @return
     */
    public void voteStopNotice(VoteActivityVo voteActivity){
        log.info("--- 活动结束订阅通知 - 活动ID: {} ,通知时间: {} ",voteActivity.getId(),DateUtils.dateTime());

        // 获取模板
        WxSubTampVo wxSubTampVo = subTampService.queryByModel(SubModelConstants.VOTE_STOP);
        if (ObjectUtil.isNotNull(voteActivity)) {
            List<WxUser> list = signService.queryWxUser(voteActivity.getId());
            log.info("--- 活动结束订阅通知人数: {} ,通知时间: {} ",list.size(),DateUtils.dateTime());
            if (CollUtil.isNotEmpty(list)){
                ArrayList<WxMaSubscribeMessage.MsgData> wxMaSubMsgList = new ArrayList<>();
                // 活动名词
                WxMaSubscribeMessage.MsgData msgData = new WxMaSubscribeMessage.MsgData();
                msgData.setName("thing1");
                msgData.setValue(voteActivity.getTitle());
                wxMaSubMsgList.add(msgData);

                // 活动结束时间
                WxMaSubscribeMessage.MsgData msgData2 = new WxMaSubscribeMessage.MsgData();
                msgData2.setName("time5");
                msgData2.setValue(DateUtils.format(voteActivity.getBalanceTime(),DateUtils.YYYYnMMnDDnHH_MM_SS));
                wxMaSubMsgList.add(msgData2);

                // 温馨提示
                WxMaSubscribeMessage.MsgData msgData3 = new WxMaSubscribeMessage.MsgData();
                msgData3.setName("thing3");
                msgData3.setValue("活动结束请前往我的活动中查看排名。");
                wxMaSubMsgList.add(msgData3);

                WeChatMessageHandler.sendWechatAppSubMessage(list,wxSubTampVo.getTampId(), wxSubTampVo.getPath(), wxMaSubMsgList);
                log.info("--- 活动结束通知成功- 通知时间: {} , 通知内容: {} ",list.size(), JSON.toJSONString(wxMaSubMsgList));
            }
            log.info("--- 活动结束通知失败- 没有需要通知的用户, 结束通知时间: {}",DateUtils.getTime());
        }
    }

    /**
     *  奖品发货通知
     * @return
     */
    public void shippingNotice(WxUser wxUser, VotePrizeReceiveVo votePrizeReceiveVo){
        // 活动订阅用户
        List<WxUser> wxUserSubVos = new ArrayList<>();
        wxUserSubVos.add(wxUser);
        ArrayList<WxMaSubscribeMessage.MsgData> wxMaSubMsgList = new ArrayList<>();
        // 获取模板
        WxSubTampVo wxSubTampVo = subTampService.queryByModel(SubModelConstants.VOTE_STOP);

        if (ObjectUtil.isNotNull(wxSubTampVo)){
            // 物品
            WxMaSubscribeMessage.MsgData msgData = new WxMaSubscribeMessage.MsgData();
            msgData.setName("thing1");
            msgData.setValue(votePrizeReceiveVo.getPrizeName());
            wxMaSubMsgList.add(msgData);

            // 收货地址
            WxMaSubscribeMessage.MsgData msgData2 = new WxMaSubscribeMessage.MsgData();
            msgData2.setName("thing4");
            msgData2.setValue(votePrizeReceiveVo.getAddress());
            wxMaSubMsgList.add(msgData2);

            // 备注
            WxMaSubscribeMessage.MsgData msgData3 = new WxMaSubscribeMessage.MsgData();
            msgData3.setName("thing6");
            msgData3.setValue("您的奖品已发货请注意查收。");
            wxMaSubMsgList.add(msgData3);

            WeChatMessageHandler.sendWechatAppSubMessage(wxUserSubVos,wxSubTampVo.getTampId(),wxSubTampVo.getPath(),wxMaSubMsgList);
        }
    }


}
